package reversi;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
 * Klasa <code>ReversiDataGetter</code> jest miniklasą służącą pobieraniu danych niezbędnych do prowadzenia gry.
 *  
 * @author Sebastian Gabor
 * @version 0.1
 *
 */

public class ReversiDataGetter {
	
	/**
	 * Konstruktor klasy ReversiDataGetter. Tworzy wzorce i przygotowuje klasę do pobierania danych z wejścia.
	 */

	public ReversiDataGetter() {
		pattern =  Pattern.compile("(\\w+) (\\d+)");
		in = new BufferedReader(new InputStreamReader(System.in));
	}
	 /**
	  * Metoda pobiera lokację w języku ludzkim i tłumaczy ją na adresy bezwzględne zrozumiałe
	  * dla silnika gry.
	  * @param color - kolor lokacji. Jest to pewna dana która może się przydać i mówi o tym co chcemy zrobić z daną lokacją
	  * @return zwraca nowy obiekt {@link BoardLocation}o
	  */
	
	public BoardLocation getLocation(byte color){
		Matcher result;
        String str = "";
		   try {		       
		        str = in.readLine();		           
	            result =pattern.matcher(str);
		        while (!result.find()) {
		        	str = in.readLine();		           
		            result =pattern.matcher(str);
		        }		     
				if (result.groupCount()==2){
					return new BoardLocation(Integer.valueOf((int)result.group(1).charAt(0))-97,Integer.parseInt(result.group(2))-1, color);
				}
			
		            
		        
		    } catch (IOException e) {
		    	System.out.println("IOException");

		    }
		    catch (IllegalStateException e){
		    	System.out.println("IllegalStateException");
		    }
		    return null;

		
	}
	
	/**
	 * Pobierz poprawną lokację. 
	 * @return zwraca lokację w poprawnym formacie
	 */
	public String getLocation(){
		Matcher result;
        String str = "";
	       
		        try {
					str = in.readLine();
			    
	            result =pattern.matcher(str);
		        while (!result.find()) {
		        	str = in.readLine();		           
		            result =pattern.matcher(str);
		        }	     
		    	} catch (IOException e) {
					e.printStackTrace();
				}	
		    	return str;
		
	}

/**
 * Pobiera imię gracza i zwraca je jako łańcuch znaków. Do wykorzystania w zaawansowanych wersjach
 * @return Zwraca pobrane imię
 */
	public String getName(){
		System.out.println("Podaj swoje imię:");
		try {
			return in.readLine();
		} catch (IOException e) {

			e.printStackTrace();
		}
		return " ";
		
	}
	/**
	 * Pobiera nazwę i zwraca je jako łańcuch znaków. Do wykorzystania w zaawansowanych wersjach
	 * @return Zwraca pobraną nazwę gry
	 */
		public String getGameName(){
			System.out.println("Podaj swoją nazwę gry:");
			try {
				return in.readLine();
			} catch (IOException e) {

				e.printStackTrace();
			}
			return " ";
			
		}
		/**
		 * Pobiera hasło i zwraca je jako łańcuch znaków. Do wykorzystania w zaawansowanych wersjach
		 * @return Zwraca pobrane hasło do gry
		 */
			public String getGamePass(){
				System.out.println("Podaj haslo dostepu do gry:");
				try {
					return in.readLine();
				} catch (IOException e) {

					e.printStackTrace();
				}
				return " ";
				
			}

	/**
	 * Obiekt klasy pattern służy do analizy ciągów wejściowych za pomocą wyrażeń regularnych.
	 */
	private Pattern pattern;
	/**
	 * Obiekt umożliwiający buforowane czytanie danych z wejścia.
	 */
	private BufferedReader in;
}
